﻿using Autofac;
using Step4.Unit6.Services;
using Step4.Unit6.Services.Impl;
using System.Reflection;

namespace Step4.Unit6
{
    /// <summary>
    /// Autofac 服务注册类
    /// </summary>
    public class AutofacModuleRegister:Autofac.Module  // 必须继承 Autofac命名空间下的Module类
    {
        // 所有的服务注册都交给Autofac了！
        // 重写load方法，load方法就是用来注册服务的
        protected override void Load(ContainerBuilder builder) // ContainerBuilder类，用于创建IContainer实例对象(这个类是用来创建容器的！) 
        {
            // 1、注册具体的类    （如果你没有服务接口，只有一个服务类的话，就这样注入）
            //builder.RegisterType<FoodService>();
            //builder.RegisterType(typeof(FoodService));

            // 2、注册服务实现类的实例
            //var foodService = new FoodService();
            //builder.RegisterInstance(foodService).As<IFoodService>();

            // 3、注册创建实例的表达式
            //builder.Register(c=>new FoodService()).As<IFoodService>();

            // 4、注册服务公开的接口     (最常用的就是注册接口)
            // 注意，指定三种不同的"声明周期"
            builder.RegisterType<FoodService>().As<IFoodService>().InstancePerDependency();// Transient(瞬态)
            builder.RegisterType<FoodService>().As<IFoodService>().InstancePerLifetimeScope(); // Scope(作用域级别)
            builder.RegisterType<FoodService>().As<IFoodService>().SingleInstance();   // Singleton(单例模式)

            // 5、属性注入  (很少使用)
            //builder.RegisterType<FoodService>().As<IFoodService>().PropertiesAutowired();

            // 6、方法注册  (代码太多，不用)


            // 7、注册泛型  (服务接口为"泛型接口"，服务实现类为"泛型类")
            builder.RegisterGeneric(typeof(CarService<>)).As(typeof(ICarService<>));

            // 8、程序集批量注册
            // builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(IFoodService))).Where(a => a.Name.Contains("FoodService")).AsImplementedInterfaces();
        }
    }

    /*
        应用中可以有多个module
        那为什么会有多个Module呢？
        因为要给不同类型的服务进行分类： 比如工具类单独放入一Module 、过滤器服务Module 

            服务类型不同，使用不同的Module来注册
    */
}
